/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.net.nntp; import java.util.Calendar; /*** * The NewGroupsOrNewsQuery class. This is used to issue NNTP NEWGROUPS and * NEWNEWS queries, implemented by * {@link org.apache.commons.net.nntp.NNTPClient#listNewNewsgroups listNewNewsGroups } * and * {@link org.apache.commons.net.nntp.NNTPClient#listNewNews listNewNews } * respectively. It prevents you from having to format * date, time, distribution, and newgroup arguments. * <p> * You might use the class as follows: * <pre> * query = new NewsGroupsOrNewsQuery(new GregorianCalendar(97, 11, 15), false); * query.addDistribution("comp"); * NewsgroupInfo[] newsgroups = client.listNewgroups(query); * </pre> * This will retrieve the list of newsgroups starting with the comp. * distribution prefix created since midnight 11/15/97. * <p> * <p> * @author Daniel F. Savarese * @see NNTPClient ***/ public final class NewGroupsOrNewsQuery { private String __date, __time; private StringBuffer __distributions; private StringBuffer __newsgroups; private boolean __isGMT; /*** * Creates a new query using the given time as a reference point. * <p> * @param date The date since which new groups or news have arrived. * @param gmt True if the date should be considered as GMT, false if not. ***/ public NewGroupsOrNewsQuery(Calendar date, boolean gmt) { int num; String str; StringBuffer buffer; __distributions = null; __newsgroups = null; __isGMT = gmt; buffer = new StringBuffer(); // Get year num = date.get(Calendar.YEAR); str = Integer.toString(num); num = str.length(); if (num >= 2) buffer.append(str.substring(num - 2)); else buffer.append("00"); // Get month num = date.get(Calendar.MONTH) + 1; str = Integer.toString(num); num = str.length(); if (num == 1) { buffer.append('0'); buffer.append(str); } else if (num == 2) buffer.append(str); else buffer.append("01"); // Get day num = date.get(Calendar.DAY_OF_MONTH); str = Integer.toString(num); num = str.length(); if (num == 1) { buffer.append('0'); buffer.append(str); } else if (num == 2) buffer.append(str); else buffer.append("01"); __date = buffer.toString(); buffer.setLength(0); // Get hour num = date.get(Calendar.HOUR_OF_DAY); str = Integer.toString(num); num = str.length(); if (num == 1) { buffer.append('0'); buffer.append(str); } else if (num == 2) buffer.append(str); else buffer.append("00"); // Get minutes num = date.get(Calendar.MINUTE); str = Integer.toString(num); num = str.length(); if (num == 1) { buffer.append('0'); buffer.append(str); } else if (num == 2) buffer.append(str); else buffer.append("00"); // Get seconds num = date.get(Calendar.SECOND); str = Integer.toString(num); num = str.length(); if (num == 1) { buffer.append('0'); buffer.append(str); } else if (num == 2) buffer.append(str); else buffer.append("00"); __time = buffer.toString(); } /*** * Add a newsgroup to the list of newsgroups being queried. Newsgroups * added this way are only meaningful to the NEWNEWS command. Newsgroup * names may include the <code> * </code> wildcard, as in * <code>comp.lang.* </code> or <code> comp.lang.java.* </code>. Adding * at least one newsgroup is mandatory for the NEWNEWS command. * <p> * @param newsgroup The newsgroup to add to the list of groups to be * checked for new news. ***/ public void addNewsgroup(String newsgroup) { if (__newsgroups != null) __newsgroups.append(','); else __newsgroups = new StringBuffer(); __newsgroups.append(newsgroup); } /*** * Add a newsgroup to the list of newsgroups being queried, but indicate * that group should not be checked for new news. Newsgroups * added this way are only meaningful to the NEWNEWS command. * Newsgroup names may include the <code> * </code> wildcard, as in * <code>comp.lang.* </code> or <code> comp.lang.java.* </code>. * <p> * The following would create a query that searched for new news in * all comp.lang.java newsgroups except for comp.lang.java.advocacy. * <pre> * query.addNewsgroup("comp.lang.java.*"); * query.omitNewsgroup("comp.lang.java.advocacy"); * </pre> * <p> * @param newsgroup The newsgroup to add to the list of groups to be * checked for new news, but which should be omitted from * the search for new news.. ***/ public void omitNewsgroup(String newsgroup) { addNewsgroup("!" + newsgroup); } /*** * Add a distribution group to the query. The distribution part of a * newsgroup is the segment of the name preceding the first dot (e.g., * comp, alt, rec). Only those newsgroups matching one of the * distributions or, in the case of NEWNEWS, an article in a newsgroup * matching one of the distributions, will be reported as a query result. * Adding distributions is purely optional. * <p> * @param distribution A distribution to add to the query. ***/ public void addDistribution(String distribution) { if (__distributions != null) __distributions.append(','); else __distributions = new StringBuffer(); __distributions.append(distribution); } /*** * Return the NNTP query formatted date (year, month, day in the form * YYMMDD. * <p> * @return The NNTP query formatted date. ***/ public String getDate() { return __date; } /*** * Return the NNTP query formatted time (hour, minutes, seconds in the form * HHMMSS. * <p> * @return The NNTP query formatted time. ***/ public String getTime() { return __time; } /*** * Return whether or not the query date should be treated as GMT. * <p> * @return True if the query date is to be treated as GMT, false if not. ***/ public boolean isGMT() { return __isGMT; } /*** * Return the comma separated list of distributions. This may be null * if there are no distributions. * <p> * @return The list of distributions, which may be null if no distributions * have been specified. ***/ public String getDistributions() { return (__distributions == null ? null : __distributions.toString()); } /*** * Return the comma separated list of newsgroups. This may be null * if there are no newsgroups * <p> * @return The list of newsgroups, which may be null if no newsgroups * have been specified. ***/ public String getNewsgroups() { return (__newsgroups == null ? null : __newsgroups.toString()); } }